#密码实训三  分组密码-DES算法及测试雪崩效应
from Crypto.Cipher import DES   #导入des类用于执行DES加密和解密操作
from Crypto.Util.Padding import pad, unpad
#pad 用于对数据进行进行填充  unpad移除填充
import base64

def pad_key(key):
    return key.ljust(8, '\0').encode('utf-8')
    #将输入的密钥字符串左对齐并用空字符\0填充至8字节长度

class DESCipher:
    def __init__(self, key):
        self.key = pad_key(key)# 对密钥进行填充以确保其长度为8字节

        #pass
    def des_encrypt(self, plaintext): #key密钥 plaintext明文
        # 将明文字符串编码为utf-8格式，并使用pad进行填充以确保数据长度时des块大小的整数倍
        plaintext = pad(plaintext.encode('utf-8'), DES.block_size)
        # 创建DES加密器，使用ECB模式
        cipher = DES.new(self.key, DES.MODE_ECB)

        ciphertext = cipher.encrypt(plaintext)#使用创建的des加密对象对填充后的明文加密
        # 返回加密后的十六进制字符串
        return ciphertext.hex()
    def des_decrypt(self, ciphertext):
        # 将十六进制字符串解码回字节
        ciphertext = bytes.fromhex(ciphertext)
        # 创建DES解密器，使用ECB模式
        cipher = DES.new(self.key, DES.MODE_ECB)
        plaintext = cipher.decrypt(ciphertext)
        # 移除填充并返回解码后的字符串，解码为utf8格式
        return unpad(plaintext, DES.block_size).decode('utf-8')










